class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n=matrix.length;
        if(n==1)return matrix[0][0];
        int[][]dp=new int[n+1][n+2];
        for(int i=0;i<=n+1;i++)dp[0][n]=0;
        for(int x=1;x<=n;x++)dp[x][0]=dp[x][n+1]=Integer.MAX_VALUE;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i-1][j+1]))+matrix[i-1][j-1];
            }
        }
        int min=Integer.MAX_VALUE;
        for(int i=1;i<=n;i++){
            min=Math.min(min,dp[n][i]);
        }
        return min;
    }
}